# -*- coding: utf-8 -*-

from odoo import models, fields, api
from odoo.exceptions import ValidationError


class CpqRule(models.Model):
    _name = 'cpq.rule'
    _description = '配置规则'
    _order = 'sequence, id'
    
    # ============ 基础信息 ============
    name = fields.Char(
        string='规则名称',
        required=True
    )
    
    sequence = fields.Integer(
        string='序号',
        default=10
    )
    
    active = fields.Boolean(
        string='有效',
        default=True
    )
    
    # ============ 规则类型 ============
    rule_type = fields.Selection([
        ('mandatory', '强制规则'),
        ('exclusion', '互斥规则'),
        ('inclusion', '包含规则'),
        ('calculation', '计算规则')
    ], string='规则类型', required=True, default='mandatory')
    
    # ============ 适用产品 ============
    product_tmpl_id = fields.Many2one(
        'product.template',
        string='产品模板',
        help='留空则适用于所有产品'
    )
    
    product_category_id = fields.Many2one(
        'product.category',
        string='产品分类',
        help='适用于该分类下的所有产品'
    )
    
    # ============ 条件和动作 ============
    condition = fields.Text(
        string='条件表达式',
        help='Python domain格式，例如: [("attribute_id.name", "=", "材料类型")]'
    )
    
    action = fields.Text(
        string='执行动作',
        help='Python代码'
    )
    
    error_message = fields.Char(
        string='错误提示',
        required=True,
        default='规则验证失败'
    )
    
    # ============ 规则配置 ============
    # 对于互斥规则
    exclusion_attribute_ids = fields.Many2many(
        'product.attribute',
        'cpq_rule_exclusion_attribute_rel',
        'rule_id',
        'attribute_id',
        string='互斥属性',
        help='这些属性不能同时选择'
    )
    
    # 对于包含规则
    source_attribute_id = fields.Many2one(
        'product.attribute',
        string='源属性',
        help='当选择此属性时'
    )
    
    source_value_id = fields.Many2one(
        'product.attribute.value',
        string='源属性值',
        domain="[('attribute_id', '=', source_attribute_id)]"
    )
    
    target_attribute_id = fields.Many2one(
        'product.attribute',
        string='目标属性',
        help='必须选择此属性'
    )
    
    target_value_id = fields.Many2one(
        'product.attribute.value',
        string='目标属性值',
        domain="[('attribute_id', '=', target_attribute_id)]",
        help='留空表示任意值'
    )
    
    # ============ 成本影响 ============
    cost_impact_formula = fields.Char(
        string='成本影响公式',
        help='例如: base_cost * 1.1 + 50'
    )
    
    # ============ 备注 ============
    description = fields.Text(
        string='描述'
    )
    
    notes = fields.Text(
        string='备注'
    )
    
    # ============ 约束 ============
    @api.constrains('rule_type', 'source_attribute_id', 'target_attribute_id')
    def _check_rule_configuration(self):
        """检查规则配置的完整性"""
        for record in self:
            if record.rule_type == 'inclusion':
                if not record.source_attribute_id or not record.target_attribute_id:
                    raise ValidationError('包含规则必须设置源属性和目标属性！')
            
            if record.rule_type == 'exclusion':
                if len(record.exclusion_attribute_ids) < 2:
                    raise ValidationError('互斥规则至少需要2个互斥属性！')

